package com.freedom.controller.w.core;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.freedom.bean.core.SysRoleMenu;
import com.freedom.bean.core.SysUser;
import com.freedom.bean.core.SysUserRole;
import com.freedom.sys.UserUtils;
import com.freedom.util.sys.CipherUtil;
import com.freedom.util.sys.HtmlUtil;
import com.freedom.vo.w.core.WebVo;

/**
 * 关于首页和登录的controller
 * @author HGJ
 *
 */
@Controller
public class SystemLoginController extends BaseWebPaginationCRUDController<WebVo>{
	private static final Logger logger = LoggerFactory.getLogger(SystemLoginController.class);

	@Override
	public String init() {
		return null;
	}
	
	/**
	 * 首页登录
	 * @return
	 */
	@RequestMapping(value="/login")
	public String index(){
		SysUser user = UserUtils.getUser();
		if(null !=user){ //如果登录了直接跳转domain
			return "main/domain";
		}
		return "../../login";
	}
	
	/**
	 * 501
	 * @return
	 */
//	@RequestMapping(value="/error")
//	public String indexNopermission(){
//		return "../../501";
//	}
	
	/**
	 * index项目根路径跳转
	 * @return
	 */
	@RequestMapping(value="/index")
	public String indexauthc(){
		return "test/test1";
	}
	
	/**
	 * 退出登录
	 */
	@RequestMapping(value="/layout",method=RequestMethod.POST)
	public String layOut(){
		Subject subject = SecurityUtils.getSubject();
		if(null!=subject) {
			if (subject.isAuthenticated()) {
		        subject.logout(); // session 会销毁，在SessionListener监听session销毁，清理权限缓存
		        if (logger.isDebugEnabled()) {
		        	logger.debug("------退出登录------");
		        }
		    }
		}
	    return "../../login";
	}
	
	/**
	 * 登录校验
	 * @param username
	 * @param password
	 * @return
	 */
	@RequestMapping(value="/checkLogin",method=RequestMethod.POST)
	public void checkLogin(@RequestParam String userName,@RequestParam String password,HttpServletResponse response){
		Map<String,Object> map = new HashMap<String, Object>();
		logger.info("------登录验证信息开始------");
		Subject subject = SecurityUtils.getSubject();
		//这里的token大家叫他令牌，也就相当于一张表格，你要去验证，你就得填个表，里面写好用户名密码，交给公安局的同志给你验证。
        UsernamePasswordToken token = new UsernamePasswordToken(userName, CipherUtil.generatePassword(password));
		/* 	但是，“已记住”和“已认证”是有区别的： 
		 	已记住的用户仅仅是非匿名用户，你可以通过subject.getPrincipals()获取用户信息。
         	但是它并非是完全认证通过的用户，当你访问需要认证用户的功能时，你仍然需要重新提交认证信息。 
		 	这一区别可以参考亚马逊网站，网站会默认记住登录的用户，再次访问网站时，
         	对于非敏感的页面功能，页面上会显示记住的用户信息，但是当你访问网站账户信息时仍然需要再次进行登录认证。*/ 
        // 回调doGetAuthenticationInfo，进行认证
        //验证是否通过 
        try {
        	token.setRememberMe(true);
        	subject.login(token);
        	Session session = subject.getSession();
        	logger.info("sessionId:"+session.getId());
        	logger.info("------登录验证信息结束------");
        	SysUser user = UserUtils.getUser();
        	if(user!=null){
        		map.put("msg", "success");
        	}else{
        		map.put("msg", "fail");
        	}
            //return "main/domain"; //此方式用作普通form表单使用
		} catch (Exception e) {
			map.put("msg", "fail");
			logger.error("登录信息错误！",e);
			//return "../../login";
		}finally{
			HtmlUtil.writerJson(response, map);
		}
	}
	
	/**
	 * 跳转成功页面
	 * @return
	 */
	@RequestMapping(value="/domain")
	public String domain(){
		try {
			//List<SysRoleMenu> sysRoleMenu = UserUtils.getSysRoleMenus();
			//System.out.println("sysRoleMenu"+sysRoleMenu);
		} catch (Exception e) {
			//e.printStackTrace();
		}
		return "main/domain";
	}

}
